package com.atguigu.gmall.payment.controller;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.payment.config.AlipayConfig;
import com.atguigu.gmall.payment.service.AlipayService;
import com.atguigu.gmall.payment.service.PaymentInfoService;
import com.atguigu.gmall.rabbit.service.RabbitService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @Author: 李旭
 * @Time: 15:01
 * @Description:
 *
 * 支付宝管理
 */
@Controller
@RequestMapping("/api/payment/alipay")
public class AlipayController {

    @Autowired
    private AlipayService alipayService;
    @Autowired
    private PaymentInfoService paymentInfoService;
/*    @Autowired
    private RabbitService rabbitService;*/
    //调用支付宝生成二维码
    @GetMapping("/submit/{orderId}")
    @ResponseBody
    public String  submit(@PathVariable Long orderId){
        return alipayService.submit(orderId);
    }

    //同步回调
    @GetMapping("/callback/return")
    public String callbackReturn(){
        System.out.println("支付宝来过了" + AlipayConfig.return_order_url);
        return "redirect:" + AlipayConfig.return_order_url;
    }

    //异步通知
    @PostMapping("/callback/notify")
    public String callbackNotify(@RequestParam Map<String, String> paramsMap){
        //将异步通知中收到的所有参数都存放到map中
        System.out.println("支付宝POST请求异步通知过来了");
        try {
            boolean signVerified = AlipaySignature.rsaCheckV1(//确实是由支付宝公司发来的
                    paramsMap, AlipayConfig.alipay_public_key,
                    AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名
            if(signVerified){
                //验签成功后，按照支付结果异步通知中的描述，对支付结果中的业务内容进行二次校验，校验成功后在response中返回success并继续商户自身业务处理，校验失败返回failure
                //金额是否正确   88
                System.out.println(paramsMap);
                //获取金额
                //String total_amount = paramsMap.get("total_amount");
                //远程调用 订单信息 获取总金额
                String trade_status = paramsMap.get("trade_status");
                if("TRADE_SUCCESS".equals(trade_status)){
                    //用户已经支付了 并且金额也是正确的
                    //发MQ 1ms  最终一致性
                    //---1:金额也是正确的
                    //2:更新支付信息表  银行流水  时间  内容
                    //3:更新订单状态 未支付改为已支付
                    //-- 4:本项目没有使用  用户收到一优惠
                    //5:订单商品库存 扣减商品剩余库存
                    //.........  用户级别  用户积分

                    paymentInfoService.paySuccess(paramsMap);

                    return "success";
                }else{
                    //交易状态是不正确的 失败
                    return "failure";
                }
                //校验金额是否正确
                //处理商户的业务  有可能超过一定时间 此时间内 你没有返回success 支付宝再次发送异步通知  幂等性问题


            }else{
                // TODO 验签失败则记录异常日志，并在response中返回failure.
                return "failure";
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return "failure";
    }




    //测试外网 域名的
    @ResponseBody
    @GetMapping("/index")
    public Result index(){

        return Result.ok();
    }

    //http://payment.gmall.com/api/payment/alipay/refund/ATGUIGU158348294514133
    //退款
    @GetMapping("/refund/{outTradeNo}")
    @ResponseBody
    public Result refund(@PathVariable String outTradeNo){

        alipayService.refund(outTradeNo);

        return Result.ok();
    }
}
